home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 September / PCWorld_2006-09_cd.bin / v cisle / flyakite / FlyakiteOSX v3.5.exe / $DESKTOP / FlyakiteOSX v3.5 Source / Force System File Update.nsi < prev    next >
Text File  |  2006-02-21  |  13KB  |  386 lines

  1. !delfile "Check Sections.nsi"
  2.  
  3. #==========================================
  4. # COMPRESSION SETTINGS
  5. #==========================================
  6.     CRCCheck force
  7.     SetCompressor /SOLID /FINAL lzma
  8.  
  9.  
  10.  
  11. #==========================================
  12. # DEFINES
  13. #==========================================
  14.     !include "Defines.nsi"
  15.     !define NAME "Force System File Update"
  16.     !define WM_CLOSE 0x0010
  17.     !define WM_COMMAND 0x0111
  18.     !define FORCESYSTEMFILEUPDATE
  19.  
  20.  
  21.  
  22. #==========================================
  23. # INCLUDES
  24. #==========================================
  25.     !include "Sections.nsh"
  26.     !addplugindir "Assets\Plugins"
  27.  
  28.  
  29.  
  30. #==========================================
  31. # INSTALLER INFORMATION
  32. #==========================================
  33.     Name "${NAME}"
  34.     OutFile "Assets\Tools\${NAME}.exe"
  35.  
  36.  
  37.  
  38. #==========================================
  39. # INTERFACE SETTINGS
  40. #==========================================
  41.     Caption "${NAME}"
  42.     SubCaption 1 " "
  43.     BrandingText "${COPYRIGHT} ${PRODUCT_PUBLISHER}"
  44.     XPStyle on
  45.     ChangeUI IDD_INST "Assets\Dialogs\${NAME}.exe"
  46.     InstallColors /windows
  47.     ShowInstDetails show
  48.     InstallButtonText "Update"
  49.     Icon "Assets\Images\Icons\Force System File Update.ico"
  50.     SpaceTexts "none"
  51.  
  52.     Var AppDir
  53.     Var FileSize
  54.     Var Office
  55.     Var UpdatedFileCount
  56.  
  57.  
  58.  
  59. #==========================================
  60. # PAGES
  61. #==========================================
  62.       ComponentText "Check the files you would like to force update. When force updating a file, the current modified file is not backed up." "" "Select system files to update:"
  63.       Page components "" "" "CheckForSelections2"
  64.       Page instfiles
  65.  
  66.  
  67.  
  68. #==========================================
  69. # INSTALLER MACROS
  70. #==========================================
  71.     !macro ForceUpdateFile UNUSED FileName TargetFolder
  72.       !define UNIQUE_LINE ${__LINE__}
  73.  
  74.       #CHECK IF FILE EXISTS
  75.       IfFileExists "${TargetFolder}\${FileName}" 0 END_${UNIQUE_LINE}
  76.       IfFileExists "${INST_RESOURCES}\${FileName}" 0 END_${UNIQUE_LINE}
  77.  
  78.       #READ REGISTRY FILE SIZE
  79.       ReadRegStr $0 HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}"
  80.       StrCmp $0 "" END_${UNIQUE_LINE}
  81.  
  82.       #DISPLAY CURRENTLY INSTALLING FILE
  83.       !insertmacro SetDetailsPrint "Force Updating File: ${FileName}"
  84.  
  85.       #MODIFY FILE
  86.       CopyFiles /SILENT "${TargetFolder}\${FileName}" "${INST_TEMPFILES}"
  87.       StrCpy "$OUTDIR" "${INST}"
  88.       ExecWait '"${INST_TOOLS}\ResHacker.exe" -script "${INST_RESOURCES}\${FileName}\${FileName}.txt"'
  89.       IfFileExists "${INST_NEWFILES}\${FileName}" +3
  90.       DeleteRegValue HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}"
  91.       Goto END_${UNIQUE_LINE}
  92.  
  93.       #WRITE NEW FILE SIZE TO REGISTRY
  94.       Push "${INST_NEWFILES}\${FileName}"
  95.       Call GetFileSize
  96.       Pop $FileSize
  97.       WriteRegStr HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}" "$FileSize"
  98.  
  99.       #REPLACE FILE IN CACHE
  100.       IfFileExists "$SYSDIR\dllcache\${FileName}" 0 +2
  101.       CopyFiles /SILENT "${INST_NEWFILES}\${FileName}" "$SYSDIR\dllcache\${FileName}"
  102.       IfFileExists "$WINDIR\ServicePackFiles\i386\${FileName}" 0 +2
  103.       CopyFiles /SILENT "${INST_NEWFILES}\${FileName}" "$WINDIR\ServicePackFiles\i386\${FileName}"
  104.  
  105.       #REPLACE FILE IN TARGET FOLDER
  106.       Delete "${TargetFolder}\${FileName}.${PRODUCT_NAME}"
  107.       Rename "${INST_NEWFILES}\${FileName}" "${TargetFolder}\${FileName}.${PRODUCT_NAME}"
  108.       ExecCmd::exec '"${INST_TOOLS}\MoveEx.exe" "${TargetFolder}\${FileName}.${PRODUCT_NAME}" "${TargetFolder}\${FileName}"'
  109.  
  110.       #COUNT UPDATED FILES
  111.       IntOp $UpdatedFileCount $UpdatedFileCount + 1
  112.  
  113.       SetRebootFlag true
  114.  
  115.       END_${UNIQUE_LINE}:
  116.       !undef UNIQUE_LINE
  117.  
  118.       #CREATE "CHECK SECTIONS.nsi" FILE
  119.       !appendfile "Check Sections.nsi" 'StrCmp "$0" "${FileName}" 0 +6$\n'
  120.       !appendfile "Check Sections.nsi" '!insertmacro SelectSection "${${FileName}}"$\n'
  121.     !macroend
  122.  
  123.  
  124.     !macro ComCtl32 UNUSED FileName TargetFolder Number
  125.       !define UNIQUE_LINE ${__LINE__}
  126.  
  127.       #CHECK IF FILE EXISTS
  128.       IfFileExists "${TargetFolder}\${FileName}" 0 END_${UNIQUE_LINE}
  129.       IfFileExists "${INST_RESOURCES}\${FileName}" 0 END_${UNIQUE_LINE}
  130.  
  131.       #READ REGISTRY FILE SIZE
  132.       ReadRegStr $0 HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}${Number}"
  133.       StrCmp $0 "" END_${UNIQUE_LINE}
  134.  
  135.       #DISPLAY CURRENTLY INSTALLING FILE
  136.       !insertmacro SetDetailsPrint "Force Updating File: ${FileName}"
  137.  
  138.       #MODIFY FILE
  139.       SetRebootFlag true
  140.       CopyFiles /SILENT "${TargetFolder}\${FileName}" "${INST_TEMPFILES}"
  141.       StrCpy "$OUTDIR" "${INST}"
  142.       ExecWait '"${INST_TOOLS}\ResHacker.exe" -script "${INST_RESOURCES}\${FileName}\${FileName}.txt"'
  143.       IfFileExists "${INST_NEWFILES}\${FileName}" +3
  144.       DeleteRegValue HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}${Number}"
  145.       Goto END_${UNIQUE_LINE}
  146.       Rename "${INST_NEWFILES}\${FileName}" "${INST_NEWFILES}\${FileName}${Number}"
  147.  
  148.       #WRITE FILE SIZE TO REGISTRY
  149.       Push "${INST_NEWFILES}\${FileName}${Number}"
  150.       Call GetFileSize
  151.       Pop $FileSize
  152.       WriteRegStr HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}${Number}" "$FileSize"
  153.  
  154.       #REPLACE FILE IN TARGET FOLDER
  155.       Delete "${TargetFolder}\${FileName}.${PRODUCT_NAME}"
  156.       Delete "${TargetFolder}\${FileName}.delete"
  157.       Rename "${TargetFolder}\${FileName}" "${TargetFolder}\${FileName}.delete"
  158.       Rename "${INST_NEWFILES}\${FileName}${Number}" "${TargetFolder}\${FileName}"
  159.  
  160.       #COUNT UPDATED FILES
  161.       IntOp $UpdatedFileCount $UpdatedFileCount + 1
  162.  
  163.       END_${UNIQUE_LINE}:
  164.       !undef UNIQUE_LINE
  165.  
  166.       #CREATE "CHECK SECTIONS.nsi" FILE
  167.       !appendfile "Check Sections.nsi" 'StrCmp "$0" "${FileName}" 0 +6$\n'
  168.       !appendfile "Check Sections.nsi" '!insertmacro SelectSection "${${FileName}}"$\n'
  169.     !macroend
  170.  
  171.  
  172.     !macro OfficeFiles MacroName FileName SubKey Entry
  173.       #GET FILE PATH
  174.       ReadRegStr $Office HKLM "${SubKey}" "${Entry}"
  175.       Push $Office
  176.       Call GetParent
  177.       Pop $Office
  178.  
  179.       !insertmacro ${MacroName} "System Files\Office" "${FileName}" "$Office"
  180.       IfFileExists "$Office\${FileName}.${PRODUCT_NAME}" 0 +9
  181.       Delete "$Office\${FileName}.delete"
  182.       Rename "$Office\${FileName}" "$Office\${FileName}.delete"
  183.       Rename "$Office\${FileName}.${PRODUCT_NAME}" "$Office\${FileName}"
  184.       Delete "$Office\${FileName}.delete"
  185.  
  186.       Push "$Office\${FileName}"
  187.       Call GetFileSize
  188.       Pop $FileSize
  189.       WriteRegStr HKLM "Software\${PRODUCT_NAME}\FILES" "${FileName}" "$FileSize"
  190.     !macroend
  191.  
  192.  
  193.     !macro SetDetailsPrint TextToPrint
  194.       SetDetailsPrint both
  195.       DetailPrint "${TextToPrint}"
  196.       SetDetailsPrint none
  197.     !macroend
  198.  
  199.  
  200.     !appendfile "Check Sections.nsi" 'StrCmp "$0" "SYSTEMFILES" 0 +6$\n'
  201.     !appendfile "Check Sections.nsi" '!insertmacro SelectSection "${SYSTEMFILES}"$\n'
  202.  
  203.  
  204.  
  205. #==========================================
  206. # SECTION - PRE UPDATE (HIDDEN)
  207. #==========================================
  208.     Section "-Pre Update"
  209.       !insertmacro SetDetailsPrint "Preparing Force Update..."
  210.       !insertmacro SetDetailsPrint ""
  211.  
  212.       #CREATE DIRECTORIES
  213.       IfFileExists "${INST}" 0 +3
  214.       CreateDirectory "${INST_NEWFILES}"
  215.       CreateDirectory "${INST_TEMPFILES}"
  216.  
  217.       ExecCmd::exec "${INST_TOOLS}\wfpdisable.exe"
  218.     SectionEnd
  219.  
  220.  
  221.  
  222. #==========================================
  223. # SECTION - SYSTEM FILES
  224. #==========================================
  225.     !include "System Files.nsi"
  226.     !insertmacro SystemFiles "/o" "" "ForceUpdateFile"
  227.  
  228.  
  229.  
  230. #==========================================
  231. # SECTION - MISC FILES
  232. #==========================================
  233.     Section /o "Logon Screen" LOGONUI.EXE
  234.         !insertmacro ForceUpdateFile "Extras\Logon Screen" "logonui.exe" "$SYSDIR"
  235.     SectionEnd
  236.  
  237.     Section /o "Boot Screen" NTOSKRNL.EXE
  238.         !insertmacro ForceUpdateFile "Extras\Boot Screen\Normal" "ntkrnlmp.exe" "$SYSDIR"
  239.         !insertmacro ForceUpdateFile "Extras\Boot Screen\Normal" "ntkrnlpa.exe" "$SYSDIR"
  240.         !insertmacro ForceUpdateFile "Extras\Boot Screen\Normal" "ntoskrnl.exe" "$SYSDIR"
  241.  
  242.         IfFileExists "$SYSDIR\ntkrnlpa.exe.${PRODUCT_NAME}" 0 +2
  243.           ExecCmd::exec  "${INST_TOOLS}\XVI32.exe $SYSDIR\ntkrnlpa.exe.${PRODUCT_NAME} /S=${INST_TOOLS}\ReplacePalette.xsc"
  244.  
  245.         IfFileExists "$SYSDIR\ntoskrnl.exe.${PRODUCT_NAME}" 0 +2
  246.           ExecCmd::exec  "${INST_TOOLS}\XVI32.exe $SYSDIR\ntoskrnl.exe.${PRODUCT_NAME} /S=${INST_TOOLS}\ReplacePalette.xsc"
  247.  
  248.         IfFileExists "$SYSDIR\ntkrnlmp.exe.${PRODUCT_NAME}" 0 +2
  249.           ExecCmd::exec  "${INST_TOOLS}\XVI32.exe $SYSDIR\ntkrnlmp.exe.${PRODUCT_NAME} /S=${INST_TOOLS}\ReplacePalette.xsc"
  250.     SectionEnd
  251.  
  252.  
  253.  
  254. #==========================================
  255. # SECTION - POST UPDATE (HIDDEN)
  256. #==========================================
  257.     Section "-Cleanup"
  258.       Delete "${INST_TOOLS}\ResHacker.ini"
  259.       RMdir "${INST_BACKUP}"
  260.       RMdir "${INST_LOGS}"
  261.       RMdir "${INST_NEWFILES}"
  262.       RMdir "${INST_RESOURCES}"
  263.       RMdir /r "${INST_TEMPFILES}"
  264.     SectionEnd
  265.  
  266.  
  267.  
  268. #==========================================
  269. # SECTION - POST UPDATE (HIDDEN)
  270. #==========================================
  271.     Section "-Post Update"
  272.       StrCmp "$UpdatedFileCount" "0" 0 MORETHANZERO
  273.       !insertmacro SetDetailsPrint "The selected files could not be updated."
  274.       Goto END
  275.  
  276.       MORETHANZERO:
  277.       StrCmp "$UpdatedFileCount" "1" 0 MORETHANONE
  278.       !insertmacro SetDetailsPrint ""
  279.       !insertmacro SetDetailsPrint "$UpdatedFileCount file has been updated and will be applied on the next reboot."
  280.       Goto +7
  281.  
  282.       MORETHANONE:
  283.       !insertmacro SetDetailsPrint ""
  284.       !insertmacro SetDetailsPrint "$UpdatedFileCount files have been updated and will be applied on the next reboot."
  285.  
  286.       Call DeleteIconCache
  287.       WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\Session Manager" "AllowProtectedRenames" 0x00000001
  288.  
  289.       END:
  290.       SetOutPath $TEMP
  291.       System::Free 0
  292.     SectionEnd
  293.  
  294.  
  295.  
  296. #==========================================
  297. # INSTALLER FUNCTIONS
  298. #==========================================
  299.     !include "Functions.nsi"
  300.  
  301.     Function .onInit
  302.       InitPluginsDir
  303.  
  304.       Call OneInstance
  305.       System::Call "kernel32::GetModuleHandle(t 'shell32.dll') i .s"
  306.       System::Call "kernel32::GetProcAddress(i s, i 680) i .r0"
  307.       System::Call "::$0() i .r0"
  308.       StrCmp "$0" "1" +3
  309.       MessageBox MB_OK "The ${NAME} tool cannot be run on a limited user account. $\nThe ${NAME} will now quit." /SD IDOK
  310.       Quit
  311.  
  312.       StrCpy $UpdatedFileCount "0"
  313.       SetShellVarContext all
  314.  
  315.       #FORCE FILE UPDATE
  316.       Push $CMDLINE
  317.       Call GetNextParm
  318.       Pop $0
  319.       StrCpy $9 ""
  320.  
  321.       PARMSLOOP:
  322.       Call GetNextParm
  323.       Pop $0
  324.       StrCmp $0 "" PARMSDONE
  325.       StrCpy $1 $0 2
  326.       StrCmp $1 "_=" PARMSDONE
  327.       StrCmp $0 "/S" PARMSLOOP
  328.       StrCpy $0 $0 "" 1
  329.       !include "Check Sections.nsi"
  330.       Goto PARMSLOOP
  331.  
  332.       PARMSDONE:
  333.       Pop $0
  334.     FunctionEnd
  335.  
  336.  
  337.     Function .onGuiEnd
  338.       SetOutPath $TEMP
  339.       System::Free 0
  340.     FunctionEnd
  341.  
  342.  
  343.     Function "CheckForSelections2"
  344.       !insertmacro SectionFlagIsSet ${SYSTEMFILES} ${SF_SELECTED} END ""
  345.       !insertmacro SectionFlagIsSet ${SYSTEMFILES} ${SF_PSELECTED} END ""
  346.       !insertmacro SectionFlagIsSet ${NTOSKRNL.EXE} ${SF_SELECTED} END ""
  347.       !insertmacro SectionFlagIsSet ${LOGONUI.EXE} ${SF_SELECTED} END ""
  348.       MessageBox MB_OK|MB_ICONEXCLAMATION "You did not select any items to update.  Please look through the options and select only the items that you want to force update."
  349.       Abort
  350.       END:
  351.     FunctionEnd
  352.  
  353.  
  354.     Function GetNextParm
  355.       Exch $0
  356.       Push $1
  357.       Push $9
  358.       Push $8
  359.       StrCpy $1 ""
  360.       TRIMLEADING:
  361.         StrCpy $9 $0 1
  362.         StrCmp $9 "" Done
  363.         StrCmp $9 '"' DELIMITQUOTE
  364.         StrCmp $9 " " "" DELIMITSPACE
  365.         StrCpy $0 $0 "" 1
  366.         Goto TRIMLEADING
  367.       DELIMITQUOTE:
  368.         StrCpy $0 $0 "" 1
  369.         Goto COPYPARM
  370.       DELIMITSPACE:
  371.         StrCpy $9 " "
  372.       COPYPARM:
  373.         StrCpy $8 $0 1
  374.         StrCmp $8 "" DONE
  375.         StrCpy $0 $0 "" 1
  376.         StrCmp $8 $9 DONE
  377.         StrCpy $1 $1$8
  378.         Goto COPYPARM
  379.       DONE:
  380.         Pop $8
  381.         Pop $9
  382.         Exch $1
  383.         Exch
  384.         Exch $0
  385.         Exch
  386.     FunctionEnd